// Proxy对象，想象成门卫，不管进去拿东西还是放东西都必须经过这样一个代理，通过proxy轻松监视到读写过程

const person = {
    name:'zce',
    age:20
}

const personProxy = new Proxy(person,{
    get (target,property){//接收两个参数，第一个是代理的目标对象，第二个是外部所访问的属性的属性名，这个方法的返回值会作为外部访问这个属性得到的结果
        return property in target ? target[property] : 'default'
        // console.log(target,property)// {name:'zce',age:20} name
        // return 100 
    },
    set (target,property,value){//接收三个参数，代理目标对象，要写入的属性名称，写入的属性值
        if(property === 'age'){
            if(!Number.isInteger(value)){
                throw new TypeError(`${value} is not an int`)
            }
        }
        target[property] = value
        // console.log(target,property,value)
    }
})
personProxy.age = 'string' //报错
console.log(personProxy.name) // 100

//Proxy 对比 Object.defineProperty() ===============================
const person = {
    name:'zce',
    age:20
}

const personProxy = new Proxy(person,{
    deleteProperty(target,property){
        console.log('delete',property) //delete age
        delete target[property]
    }
})

delete personProxy.age
console.log(person)//{name:'zce'}

// Proxy 更好的支持数组对象的监视
const list = []

const listProxy = new Proxy(list,{
    set(target,property,value){// 监视数据的写入
        console.log('set',property,value)
        target[property] = value
        return true //表示设置成功
    }
})

listProxy.push(100) // set 0 100  其中0是数组下标

//Proxy 以非侵入的方式监管了对象的读写，不需要对对象本身做任何的操作，可以监视到内部成员的读写